<?php

// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2018 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Powerless < wzxaini9@gmail.com>
// +----------------------------------------------------------------------

namespace app\user\model;

use think\Db;
use think\Model;

class UserModel extends Model {

    protected $type = [
        'more' => 'array',
    ];

    public function doMobile($user) {
        $result = $this->where('mobile', $user['mobile'])->find();


        if (!empty($result)) {
            $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => $comparePasswordResult
            ];
            hook_one("user_login_start", $hookParam);
            if ($comparePasswordResult) {
                //拉黑判断。
                if ($result['user_status'] == 0) {
                    return 3;
                }
                session('user', $result->toArray());
                $data = [
                    'last_login_time' => time(),
                    'last_login_ip' => get_client_ip(0, true),
                ];
                $this->where('id', $result["id"])->update($data);
                $token = cmf_generate_user_token($result["id"], 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
            return 1;
        }
        $hookParam = [
            'user' => $user,
            'compare_password_result' => false
        ];
        hook_one("user_login_start", $hookParam);
        return 2;
    }

    public function doName($user) {
        $result = $this->where('user_login', $user['user_login'])->find();
        if (!empty($result)) {
            $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => $comparePasswordResult
            ];
            hook_one("user_login_start", $hookParam);
            if ($comparePasswordResult) {
                //拉黑判断。
                if ($result['user_status'] == 0) {
                    return 3;
                }
                session('user', $result->toArray());
                $data = [
                    'last_login_time' => time(),
                    'last_login_ip' => get_client_ip(0, true),
                ];
                $result->where('id', $result["id"])->update($data);
                $token = cmf_generate_user_token($result["id"], 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
            return 1;
        }
        $hookParam = [
            'user' => $user,
            'compare_password_result' => false
        ];
        hook_one("user_login_start", $hookParam);
        return 2;
    }

    public function doSJ($user) {
        $map = array();
        $map["user_login"] = $user['user_login'];
        $map["user_category"] = 1;
        $result = $this->where($map)->find();
        if (!empty($result)) {
            $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => $comparePasswordResult
            ];
            hook_one("user_login_start", $hookParam);
            if ($comparePasswordResult) {
                //拉黑判断。
                if ($result['user_status'] == 0) {
                    return 3;
                }
                session('user', $result->toArray());
                $data = [
                    'last_login_time' => time(),
                    'last_login_ip' => get_client_ip(0, true),
                ];
                $result->where('id', $result["id"])->update($data);
                $token = cmf_generate_user_token($result["id"], 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
            return 1;
        }
        $hookParam = [
            'user' => $user,
            'compare_password_result' => false
        ];
        hook_one("user_login_start", $hookParam);
        return 2;
    }

    public function doWL($user) {
        $map = array();
        $map["user_login"] = $user['user_login'];
        $map["user_category"] = 2;
        $result = $this->where($map)->find();
        if (!empty($result)) {
            $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => $comparePasswordResult
            ];
            hook_one("user_login_start", $hookParam);
            if ($comparePasswordResult) {
                //拉黑判断。
                if ($result['user_status'] == 0) {
                    return 3;
                }
                session('user', $result->toArray());
                $data = [
                    'last_login_time' => time(),
                    'last_login_ip' => get_client_ip(0, true),
                ];
                $result->where('id', $result["id"])->update($data);
                $token = cmf_generate_user_token($result["id"], 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
            return 1;
        }
        $hookParam = [
            'user' => $user,
            'compare_password_result' => false
        ];
        hook_one("user_login_start", $hookParam);
        return 2;
    }

    public function doLoginGZH($user) {
        $map = array();
        $map["gzh_open_id"] = $user['gzh_open_id'];
        $result = $this->where($map)->find();
        if (!empty($result)) {
            //  $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => true
            ];
            hook_one("user_login_start", $hookParam);
            // if ($comparePasswordResult) {
            //拉黑判断。
            if ($result['user_status'] == 0) {
                return 3;
            }
            session('user', $result->toArray());
            $data = [
                'last_login_time' => time(),
                'last_login_ip' => get_client_ip(0, true),
            ];
            $result->where('id', $result["id"])->update($data);
            $token = cmf_generate_user_token($result["id"], 'web');
            if (!empty($token)) {
                session('token', $token);
            }
            return 0;
        } else {

            return 3;
        }
    }

    public function doGZH($user) {
        $map = array();
        $map["gzh_open_id"] = $user['gzh_open_id'];
        $map["user_login"] = $user['user_login'];
        $map["user_category"] = 1;
        $result = $this->where($map)->find();
        if (!empty($result)) {
            //  $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => true
            ];
            hook_one("user_login_start", $hookParam);
            // if ($comparePasswordResult) {
            //拉黑判断。
            if ($result['user_status'] == 0) {
                return 3;
            }
            session('user', $result->toArray());
            $data = [
                'last_login_time' => time(),
                'last_login_ip' => get_client_ip(0, true),
            ];
            $result->where('id', $result["id"])->update($data);
            $token = cmf_generate_user_token($result["id"], 'web');
            if (!empty($token)) {
                session('token', $token);
            }
            return 0;
            $hookParam = [
                'user' => $user,
                'compare_password_result' => false
            ];
            hook_one("user_login_start", $hookParam);
            return 2;
        } else {
            $map = array();
            $map["user_login"] = $user['user_login'];
            $result_ishave = $this->where($map)->find();
            if (!empty($result_ishave)) {
                $arr = array();
                $arr["gzh_open_id"] = $user['gzh_open_id'];
                $result_u = $this->save($arr, 'id=' . $result_ishave['id']);
                if ($result_u !== false) {
                    $maap=array();
                    $maap['id']=$result_ishave['id'];
                    $result_user = $this->where($maap)->find();
                    session('user', $result_user->toArray());
                    $data = [
                        'last_login_time' => time(),
                        'last_login_ip' => get_client_ip(0, true),
                    ];
                    $result_user->where('id', $result_user["id"])->update($data);
                    $token = cmf_generate_user_token($result_user["id"], 'web');
                    if (!empty($token)) {
                        session('token', $token);
                    }
                    return 0;
                } else {
                    // $this->error("操作失败");
                }
            } else {
                $userStatus = 1;
                if (cmf_is_open_registration()) {
                    $userStatus = 2;
                }
                $data = [
                    'user_login' => empty($user['user_login']) ? '' : $user['user_login'],
                    'user_email' => empty($user['mobile']) ? '' : $user['mobile'],
                    'mobile' => empty($user['user_login']) ? '' : $user['user_login'],
                    'user_nickname' => empty($user['user_login']) ? '' : $user['user_login'],
                    'gzh_open_id' =>  $user['gzh_open_id'],
                    'user_pass' => cmf_password($user['user_pass']),
                    'last_login_ip' => get_client_ip(0, true),
                    'create_time' => time(),
                    'last_login_time' => time(),
                    'user_status' => $userStatus,
                    "user_type" => 2, //会员
                ];
                $userId = Db::name("user")->insertGetId($data);
                $data = Db::name("user")->where('id', $userId)->find();
                cmf_update_current_user($data);
                $token = cmf_generate_user_token($userId, 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
        }
    }

    public function doEmail($user) {

        $result = $this->where('user_email', $user['user_email'])->find();

        if (!empty($result)) {
            $comparePasswordResult = cmf_compare_password($user['user_pass'], $result['user_pass']);
            $hookParam = [
                'user' => $user,
                'compare_password_result' => $comparePasswordResult
            ];
            hook_one("user_login_start", $hookParam);
            if ($comparePasswordResult) {

//拉黑判断。
                if ($result['user_status'] == 0) {
                    return 3;
                }
                session('user', $result->toArray());
                $data = [
                    'last_login_time' => time(),
                    'last_login_ip' => get_client_ip(0, true),
                ];
                $this->where('id', $result["id"])->update($data);
                $token = cmf_generate_user_token($result["id"], 'web');
                if (!empty($token)) {
                    session('token', $token);
                }
                return 0;
            }
            return 1;
        }
        $hookParam = [
            'user' => $user,
            'compare_password_result' => false
        ];
        hook_one("user_login_start", $hookParam);
        return 2;
    }

    public function register($user, $type) {
        switch ($type) {
            case 1:
                $result = Db::name("user")->where('user_login', $user['user_login'])->find();
                break;
            case 2:
                $result = Db::name("user")->where('mobile', $user['mobile'])->find();
                break;
            case 3:
                $result = Db::name("user")->where('user_email', $user['user_email'])->find();
                break;
            default:
                $result = 0;
        }

        $userStatus = 1;

        if (cmf_is_open_registration()) {
            $userStatus = 2;
        }

        if ($result) {
            $data = [
                'user_login' => empty($user['user_login']) ? '' : $user['user_login'],
                'user_email' => empty($user['mobile']) ? '' : $user['mobile'],
                'mobile' => empty($user['user_email']) ? '' : $user['user_email'],
                'user_nickname' => empty($user['user_nickname']) ? '' : $user['user_nickname'],
                'user_pass' => cmf_password($user['user_pass']),
                'last_login_ip' => get_client_ip(0, true),
                'create_time' => time(),
                'last_login_time' => time(),
                'user_status' => $userStatus,
                "user_type" => 2, //会员
            ];
            $userId = Db::name("user")->insertGetId($data);
            $data = Db::name("user")->where('id', $userId)->find();
            cmf_update_current_user($data);
            $token = cmf_generate_user_token($userId, 'web');
            if (!empty($token)) {
                session('token', $token);
            }
            return 0;
        }
        return 1;
    }

    public function app_register($user, $type) {
        switch ($type) {
            case 1:
                $result = Db::name("user")->where('user_login', $user['user_login'])->find();
                break;
            case 2:
                $result = Db::name("user")->where('mobile', $user['mobile'])->find();
                break;
            case 3:
                $result = Db::name("user")->where('user_email', $user['user_email'])->find();
                break;
            default:
                $result = 0;
        }

        $userStatus = 1;

        if (cmf_is_open_registration()) {
            $userStatus = 2;
        }
        if (empty($result)) {
            $data = [
                'user_login' => empty($user['mobile']) ? '' : $user['mobile'],
                'mobile' => empty($user['mobile']) ? '' : $user['mobile'],
                'user_email' => empty($user['user_email']) ? '' : $user['user_email'],
                'user_nickname' => empty($user['user_nickname']) ? '' : $user['user_nickname'],
                'user_pass' => cmf_password($user['user_pass']),
                'last_login_ip' => get_client_ip(0, true),
                'create_time' => time(),
                'last_login_time' => time(),
                'user_status' => $userStatus,
                "user_type" => 4, //司机
                "user_category" => 1, //司机
            ];
            $userId = Db::name("user")->insertGetId($data);
            $data = Db::name("user")->where('id', $userId)->find();
            cmf_update_current_user($data);
            $token = cmf_generate_user_token($userId, 'web');
            if (!empty($token)) {
                session('token', $token);
            }
            return 0;
        }
        return 1;
    }

    /**
     * 通过邮箱重置密码
     * @param $email
     * @param $password
     * @return int
     */
    public function emailPasswordReset($email, $password) {
        $result = $this->where('user_email', $email)->find();
        if (!empty($result)) {
            $data = [
                'user_pass' => cmf_password($password),
            ];
            $this->where('user_email', $email)->update($data);
            return 0;
        }
        return 1;
    }

    /**
     * 通过手机重置密码
     * @param $mobile
     * @param $password
     * @return int
     */
    public function mobilePasswordReset($mobile, $password) {
        $userQuery = Db::name("user");
        $result = $userQuery->where('mobile', $mobile)->find();
        if (!empty($result)) {
            $data = [
                'user_pass' => cmf_password($password),
            ];
            $userQuery->where('mobile', $mobile)->update($data);
            return 0;
        }
        return 1;
    }

    public function editData($user) {
        $userId = cmf_get_current_user_id();

        if (isset($user['birthday'])) {
            $user['birthday'] = strtotime($user['birthday']);
        }

        $get_current_user = cmf_get_current_user();
        if ($get_current_user['user_login']) {
            $field = 'user_nickname,sex,birthday,user_url,signature,more';
        } else {
            $field = 'user_login,user_nickname,sex,birthday,user_url,signature,more';
        }
        if ($this->allowField($field)->save($user, ['id' => $userId])) {
            $userInfo = $this->where('id', $userId)->find();
            cmf_update_current_user($userInfo->toArray());
            return 1;
        }
        return 0;
    }

    /**
     * 用户密码修改
     * @param $user
     * @return int
     */
    public function editPassword($user) {
        $userId = cmf_get_current_user_id();
        $userQuery = Db::name("user");
        if ($user['password'] != $user['repassword']) {
            return 1;
        }
        $pass = $userQuery->where('id', $userId)->find();
        if (!cmf_compare_password($user['old_password'], $pass['user_pass'])) {
            return 2;
        }
        $data['user_pass'] = cmf_password($user['password']);
        $userQuery->where('id', $userId)->update($data);
        return 0;
    }

    public function comments() {
        $userId = cmf_get_current_user_id();
        $userQuery = Db::name("Comment");
        $where['user_id'] = $userId;
        $where['delete_time'] = 0;
        $favorites = $userQuery->where($where)->order('id desc')->paginate(10);
        $data['page'] = $favorites->render();
        $data['lists'] = $favorites->items();
        return $data;
    }

    public function deleteComment($id) {
        $userId = cmf_get_current_user_id();
        $userQuery = Db::name("Comment");
        $where['id'] = $id;
        $where['user_id'] = $userId;
        $data['delete_time'] = time();
        $userQuery->where($where)->update($data);
        return $data;
    }

    /**
     * 绑定用户手机号
     */
    public function bindingMobile($user) {
        $userId = cmf_get_current_user_id();
        $data ['mobile'] = $user['username'];
        Db::name("user")->where('id', $userId)->update($data);
        $userInfo = Db::name("user")->where('id', $userId)->find();
        cmf_update_current_user($userInfo);
        return 0;
    }

    /**
     * 绑定用户邮箱
     */
    public function bindingEmail($user) {
        $userId = cmf_get_current_user_id();
        $data ['user_email'] = $user['username'];
        Db::name("user")->where('id', $userId)->update($data);
        $userInfo = Db::name("user")->where('id', $userId)->find();
        cmf_update_current_user($userInfo);
        return 0;
    }

    /**
     * 判断用户名或者手机号是否已经存在
     */
    public function checkDriverCode($user) {
        $return = 0;
        $data ['user_login'] = $user['user_login'];
        $login_result = Db::name("user")->where('user_login', $user['user_login'])->select();

        $mobile_result = Db::name("user")->where('mobile', $user['mobile'])->select();
        if (count($login_result) > 0) {
            $return = 1;
        }
        if (count($mobile_result) > 0) {
            $return = 2;
        }
        return $return;
    }

    /**
     * 判断用户名或者手机号是否已经存在
     */
    public function checkLogCode($user) {
        $return = 0;
// $data ['user_login'] = $user['user_login'];
        $login_result = Db::name("user")->where('user_login', $user['user_login'])->select();
        $nickname_result = Db::name("user")->where('user_nickname', $user['user_nickname'])->select();
        if (count($login_result) > 0) {
            $return = 1;
        }
        if (count($nickname_result) > 0) {
            $return = 2;
        }
        return $return;
    }

    /**
     * 判断客户公司是否存在
     */
    public function checkCompanyCode($user) {
        $return = 0;
        $data ['user_login'] = $user['user_login'];
        $login_result = Db::name("user")->where('user_login', $user['user_login'])->select();
        $nickname_result = Db::name("user")->where('user_nickname', $user['user_nickname'])->select();
        if (count($login_result) > 0) {
            $return = 1;
        }
        if (count($nickname_result) > 0) {
            $return = 2;
        }
        return $return;
    }

    /**
     * 判断跟单员是否已经存在
     */
    public function checkSysCode($user) {
        $return = 0;
        $data ['user_login'] = $user['user_login'];
        $login_result = Db::name("user")->where('user_login', $user['user_login'])->select();
        $nickname_result = Db::name("user")->where('user_nickname', $user['user_nickname'])->select();
        if (count($login_result) > 0) {
            $return = 1;
        }
        if (count($nickname_result) > 0) {
            $return = 2;
        }
        return $return;
    }

}
